﻿
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using TaxiCaosRESTServices.Persistencia;
using TaxiCaosRESTServices.Dominio;
using TaxiCaosRESTServices.Exceptions;
using System.ServiceModel.Web;
using System.Net;
using System.Messaging;

namespace TaxiCaosRESTServices
{
    public class Unidades : IUnidades
    {
        private UnidadDAO dao = new UnidadDAO();

        public Unidad CrearUnidad(Unidad unidadACrear)
        {

            Unidad unidad_valida = new Unidad();
            unidad_valida = dao.ObtenerPorPlaca(unidadACrear);

            if (unidad_valida != null)
            {
               throw new WebFaultException<UnidadException>(new UnidadException() { Message = "El número de placa ingresado ya fue registrado para otra unidad" }, HttpStatusCode.BadRequest);
            }

            return dao.CrearUnidad(unidadACrear);

        }

        public Unidad ObtenerUnidad(string codigo)
        {
            int cod = Convert.ToInt32(codigo);
            return dao.ObtenerUnidad(cod);
        }

        public Unidad ModificarUnidad(Unidad unidadAModificar)
        {

            Unidad unidad_valida = new Unidad();
            unidad_valida = dao.ObtenerPorPlaca(unidadAModificar);

            if (unidad_valida != null)
            {
                throw new WebFaultException<UnidadException>(new UnidadException() { Message = "El número de placa ingresado ya fue registrado para otra unidad" }, HttpStatusCode.BadRequest);
            }

            return dao.ModificarUnidad(unidadAModificar);


        }

        public void EliminarUnidad(Unidad unidadAEliminar)
        {

            EmpleadosWS.EmpleadosClient proxy = new EmpleadosWS.EmpleadosClient();
            EmpleadosWS.Empleado empleado_ = new EmpleadosWS.Empleado();
            empleado_ = proxy.ObtenerUnidadAsignaEmpleado(unidadAEliminar.IdUnidad);

            if (empleado_ != null)
            {
                throw new WebFaultException<UnidadException>(new UnidadException() { Message = "No se puede eliminar esta unidad, ya que se encuentra asignada al empleado " + empleado_.Nombres + " " + empleado_.Apellidos }, HttpStatusCode.BadRequest);
            }

            dao.EliminarUnidad(unidadAEliminar);
        }

        public List<Unidad> ListarUnidades()
        {
            return dao.ListarTodos();
        }

        public String ColaUnidadRegistraPost(Unidad _unidadACrearCola)
        {

            String rep;
            rep = "OK";

            try
            {
                // 1. Enviamos los datos de las unidades (In)
                string rutaColaIn = @".\private$\unidades";
                if (!MessageQueue.Exists(rutaColaIn))
                    MessageQueue.Create(rutaColaIn);
                MessageQueue colaIn = new MessageQueue(rutaColaIn);
                Message mensajeIn = new Message();
                mensajeIn.Label = "ColaUnidades";
                mensajeIn.Body = new Unidad() { IdUnidad = 0, IdMarca = _unidadACrearCola.IdMarca, Tipo = _unidadACrearCola.Tipo, Placa = _unidadACrearCola.Placa, Estado = _unidadACrearCola.Estado };
                colaIn.Send(mensajeIn);
            }
            catch
            {
                rep = "ERROR";
            }

            return rep;
        }


    }
}